package com.zr.planclass.service.impl;

import com.zr.planclass.mapper.PlanClassMapper;
import com.zr.planclass.model.pojo.PlanClass;
import com.zr.planclass.model.pojo.PlanClassAddVo;
import com.zr.planclass.service.BatchImportService;
import com.zr.share.config.ErrorMassage;
import com.zr.utils.result.ResultBuilderUtil;
import com.zr.utils.result.ResultUtil;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName BatchImportServiceImpl
 * @Description TODO
 * @Author Jiakui_Ma
 * @Date 2019/11/19 16:51
 */
@Service
public class BatchImportServiceImpl implements BatchImportService {
    @Autowired
    private PlanClassMapper planClassMapper;

    @Override
    public ResultUtil importFile(MultipartFile file) {
        //2.提示版本问题，询问产品经理支持哪种版本的导入格式，使用2007版本的导入模板，根据版本不同，poi导入技术的读取方式不同
        if (!file.getOriginalFilename().contains("xlsx")){
            return ResultBuilderUtil.error(ErrorMassage.FILE_TYPE_NOT_SUPPORT);
        }
        //验证模板、字段值是否正确
        ResultUtil<List<PlanClassAddVo>> resultFile = poiReadFile(file);
        if (!resultFile.getSuccess()){
            return resultFile;
        }
        ResultUtil validateImport = validateImport(resultFile.getData());
        if (validateImport.getSuccess()) {
            return validateImport;
        }
        return validateImport;
    }

    @Override
    public ResultUtil export(HttpServletResponse resp, PlanClass planClass) {
        //1.根据条件查询出数据
       /* List<PlanClass> planClassVoList = planClassMapper.queryDataExport(planClass);
        for (PlanClass planClassVo:planClassVoList){
            Integer status = planClassVo.getStatus()==false?0:1;
            planClassVo.setStatusName(StatusEnumSub.getName(status));
        }
        //2.验证条数是否小于一万条
        int count =  planClassMapper.getExportCount(planClass);
        if (count>10000){
            return ResultBuilderUtil.error("超出导出限制！默认只能导出10000条数据！");
        }
        //3.把数据写入到excel模板中
        //4.把excel文档交给response，浏览器会自动生成一个文件。
        //获取响应输出流
        ServletOutputStream out = null;
        InputStream in = null;
        try {
            out= resp.getOutputStream();
            //给输出文件设置名称
            POIClass.toPackageOs(resp, "计划大类导出");
            //读取模板中的数据
            in =  ExportUtil.toPackageIn("templates/计划大类导出模板.xlsx");
            //根据模板的数据、把查询出来的数据给摸版SHeet1组中的数据赋值、把excel输出到浏览器上
            writeDataToExcel(in, "Sheet1", planClassVoList, out);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (in != null) {
                in.close();
                out.close();
            }
        }*/
        return ResultBuilderUtil.success(null);

        }

    private ResultUtil<List<PlanClassAddVo>> poiReadFile(MultipartFile file) {
        List<PlanClassAddVo> planClassAddVos = new ArrayList<>();
        //poi核心类，用来读取excel表格中的数据
        XSSFWorkbook workbook = null;
        try {
            workbook = new XSSFWorkbook(file.getInputStream());
            //获取单元格中的信息 at0是获取sheet1中的数据。
            XSSFSheet sheet = workbook.getSheetAt(0);
            //验证第一列第一行的表格标头信息是否为 “询价单导入”，如果不是，提示模板错误。
            if (!String.valueOf(sheet.getRow(sheet.getFirstRowNum()).getCell(0)).equals(ErrorMassage.PLAN_CLASS_TEMPLATE)) {
                return ResultBuilderUtil.error(ErrorMassage.TEMPLATE_ERROR);
            }
            //遍历excel表格中的所有数据，从第五行开始读取，没有数据时终止遍历。
            for (int i = sheet.getFirstRowNum() + 4; i <= sheet.getLastRowNum(); i++) {
                //读取每一行的数据
                XSSFRow xssfRow = sheet.getRow(i);
                if(xssfRow!=null) {
                    if (!String.valueOf(xssfRow.getCell(1)).equals("")
                            ||!String.valueOf(xssfRow.getCell(2)).equals("")
                            ||!String.valueOf(xssfRow.getCell(3)).equals("")){
                        PlanClassAddVo planClassAddVo = new PlanClassAddVo();
                        planClassAddVo.setCode(String.valueOf(xssfRow.getCell(1)));
                        planClassAddVo.setName(String.valueOf(xssfRow.getCell(2)));
                        planClassAddVo.setStatusName(String.valueOf(xssfRow.getCell(3)));
                        planClassAddVo.setRemark(String.valueOf(xssfRow.getCell(4)));
                        planClassAddVos.add(planClassAddVo);
                    }
                }
            }
        } catch (IOException e) {
            return ResultBuilderUtil.error(ErrorMassage.FILE_NOT_BE_FOUND);
        }catch (ClassCastException c){
            return ResultBuilderUtil.error(ErrorMassage.TEXT_FORMAT_ERROR);
        }catch (NullPointerException n){
            return ResultBuilderUtil.error(ErrorMassage.TEXT_FORMAT_ERROR);

        }
        return ResultBuilderUtil.success(planClassAddVos);
    }

    public ResultUtil validateImport(List<PlanClassAddVo> planClassAddVos){
        //5.验证不为空字段是否为空
        //6.验证字符长度是否符合需求
        //7.验证数据是否存在也就是是否合法
        //8.验证数据是否重复
        // 9.对于需要转换的数据进行数据转换，比如数据库存的数据为数字格式，用户输入的为汉字，需要把汉字转换为数字存储
        for (PlanClassAddVo planClassAddVo:planClassAddVos){
            //验证备件编码
            if (planClassAddVo.getCode().isEmpty()){
                return ResultBuilderUtil.error(ErrorMassage.SPARE_CODE_NOT_NULL);
            }else{
                if (planClassAddVo.getCode().length()>50){
                    return ResultBuilderUtil.error(ErrorMassage.SPARE_CODE_TOO_LONG);
                }
                if (planClassMapper.queryPlanClassCode(planClassAddVo.getCode()) >0){
                    return ResultBuilderUtil.error(ErrorMassage.SPARE_NOT_EXIST);
                }

            }
            //验证备件名称
            if (planClassAddVo.getName().isEmpty()){
                return ResultBuilderUtil.error(ErrorMassage.SPARE_NAME_NOT_NULL);
            }else{
                if (planClassAddVo.getName().length()>50){
                    return ResultBuilderUtil.error(ErrorMassage.SPARE_NAME_TOO_LONG);
                }
            }
            //验证状态
            if (planClassAddVo.getStatusName().equals("启用")) {
                planClassAddVo.setStatus(true);
            }else {
                planClassAddVo.setStatus(false);
            }
            planClassMapper.batchAddPlanClass(planClassAddVos);
        }
        return ResultBuilderUtil.success(planClassAddVos);
    }
}
